package com.wjw.java.basic.recursion_;

/**
 * 递归：自己调用自己
 * 如果递归没有结束条件,就会出现死循环,
 * 不停的调用自己,会造成栈内存溢出StackOverflowError
 */
public class Recursion {
    public static void main(String[] args) {
        T t = new T();
        t.test(4);
        System.out.println("------------------------------------");
        int factorial = t.factorial(5);
        System.out.println("5的阶乘:"+factorial);
        System.out.println("------------------------------------");
        int fibonacci = t.fibonacci(-1);
        System.out.println("7的菲波那切数列："+fibonacci);
        System.out.println("------------------------------------");
    }
}

class T{
    /**
     * 1.简单递归测试
     * @param n
     */
    public void test(int n){
        if(n > 2){
            test(n - 1);
        }
        System.out.println("n:"+n);
    }

    /**
     * 2.求n的阶乘：如求5的阶乘 = 1*2*3*4*5 = 120
     * @param n
     * @return
     */
    public int factorial(int n){
        if(n == 1){
            return 1;
        }else{
            return factorial(n - 1) * n;
        }
    }

    /**
     * 3.求n的菲波那切数列：
     * n = 1, 结果为1
     * n = 2, 结果为1
     * n >=3, 结果为前面两个数的和
     * @param n
     * @return
     */
    public int fibonacci(int n){
        if(n >= 1){
            if(n == 1 || n == 2){
                return 1;
            }else {
                return fibonacci(n - 1) + fibonacci(n - 2);
            }
        }else{
            System.out.println("输入的数字必须>=1");
            return -1;
        }
    }
}
